package editorsvg.editor.serializacion;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;

/**
 * Responsable de escribir los documentos SVG.
 * @author Jorge Berjano
 */
public class EscritorSVG {

    private Writer writer;

    public EscritorSVG(String nombreArchivo) throws FileNotFoundException {
        writer = new OutputStreamWriter(new FileOutputStream(nombreArchivo));
    }

    public EscritorSVG(File archivo) throws FileNotFoundException {
        writer = new OutputStreamWriter(new FileOutputStream(archivo));
    }

    public EscritorSVG(OutputStream flujoSalida) {
        writer = new OutputStreamWriter(flujoSalida);
    }
    private int identacion;

    public void escribir(ElementoXml elemento) throws IOException {
        escribir("<?xml version=\"1.0\" standalone=\"no\"?>");

        escribirElemento(elemento);
        writer.flush();
        writer.close();
    }

    private void escribirElemento(ElementoXml elemento) throws IOException {
        String textoContenido = null;
        nuevaLinea();
        escribir("<" + elemento.getNombreTag());

        List atributos = elemento.getAtributosXml();
        if (atributos != null) {
            for (Object atributo : atributos) {
                if (!(atributo instanceof AtributoXml)) {
                    continue;
                }
                AtributoXml atributoXml = ((AtributoXml) atributo);
                if (atributoXml.getNombreAtributoXml() == null) {
                    textoContenido = atributoXml.getValorAtributoXml();
                    continue;
                }
                if (atributoXml.getValorAtributoXml() != null &&
                        !atributoXml.getValorAtributoXml().isEmpty()) {
                    escribir(" " + atributoXml.getNombreAtributoXml());
                    escribir("='" + atributoXml.getValorAtributoXml() + "'");
                }
            }
        }

        List hijos = elemento.getHijos();
        if (hijos != null || textoContenido != null) {
            escribir(">");


            if (textoContenido != null) {
                escribir(textoContenido);
            }

            if (hijos != null) {
                identacion++;
                nuevaLinea();
                for (Object hijo : hijos) {
                    if (hijo instanceof ElementoXml) {
                        escribirElemento((ElementoXml) hijo);
                    }
                }
                identacion--;
                nuevaLinea();
            }
            escribir("</" + elemento.getNombreTag() + ">");
        } else {
            escribir("/>");
        }
    }

    protected final void escribir(String texto) throws IOException {
        writer.write(texto);
    }

    private final void nuevaLinea() throws IOException {
        writer.write("\n");
        for (int i = 0; i < identacion; i++) {
            writer.write("    ");
        }
    }
}
